package com.wl.dzt.sys.core.dao.curd;

import com.wl.dzt.sys.core.dao.curd.sql.SqlSearchResult;
import com.wl.dzt.sys.core.dao.select.Select;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;


/**
 * @author wl_code@163.com
 * @version 1.0
 * @date 2018/7/5/005
 * @description 增删改查接口
 * 执行相应数据库操作
 */
public interface CrudCommand {

    /**
     * <b>新增</b>
     * <p>
     * 新增一个数据
     * </p>
     *
     * @param entity
     * @return
     */
    boolean insert(Object entity);

    /**
     * <b>修改</b>
     * <p>
     * 修改一个数据
     * </p>
     *
     * @param entity
     * @return
     */
    boolean update(Object entity);

    /**
     * <b>删除</b>
     * <p>
     * 根据ID和所对应实体删除一个数据
     * </p>
     *
     * @param clazz
     * @param id
     * @return
     */
    boolean delete(Class<?> clazz, String id);

    /**
     * <b>查询</b>
     * <p>
     * 根据条件查询数据
     * </p>
     *
     * @param select
     * @return
     */
    <T> List<T> select(Select select);

    /**
     * <b>总数</b>
     * <p>
     * 根据条件查询数据总数
     * </p>
     *
     * @param select
     * @return
     */
    Integer count(Select select);

    /**
     * <b>查询成map</b>
     * <p>
     * 查询数据结果集为一个map
     * </p>
     *
     * @param select
     * @return
     */
    List<Map<String, Object>> selectByMap(Select select);

    /**
     * <b>获取jdbctemplate</b>
     * <p>
     * 获取spring的jdbctemplate
     * </p>
     *
     * @return
     */
    JdbcTemplate getJdbcTemplate();

    /**
     * <b>执行sql</b>
     * <p>
     * 根据解析后的语句执行一段sql
     * </p>
     *
     * @param result
     * @param entity
     * @return
     */
    boolean excute(CrudConvertResult result, Object entity);

    /**
     * <b>改变JdbcTemplate </b>
     * <p>
     * 动态设置JdbcTemplate
     * </p>
     */
    void changeJdbcTemplate(JdbcTemplate jdbcTemplate);

    /**
     * <b>改变 convert</b>
     * <p>
     * 动态设置 CrudConvert
     * </p>
     *
     * @param convert
     */
    void changeCrudConvert(CrudConvert convert);

    /**
     * <b>根据sql表达式查询</b>
     * <p>
     * 使用特殊的sql表达式查询
     * </p>
     *
     * @param select
     * @return
     */
    SqlSearchResult selectBySqlExp(Select select);

}
